المرشحات ودوال المرشح (Filter) المعقمة في PHP: الاستخدامات، الأنواع، وآليات الحماية من الثغرات
مقدمة
تُعد لغة PHP من أكثر اللغات استخدامًا في تطوير تطبيقات الويب، ويُعزى ذلك إلى مرونتها، سهولة تعلمها، وتوافر أدواتها المدمجة لمعالجة المدخلات والتحقق منها. واحدة من أبرز الأدوات التي تتيح للمطورين ضمان أمان التطبيقات وتصفية البيانات الواردة من المستخدمين هي “المرشحات” أو Filters، وهي مجموعة من الدوال والآليات المُضمنة ضمن مكتبة PHP القياسية (PHP Filter Extension)، والتي توفر وسيلة فعالة لتعقيم البيانات، التحقق منها، وتجنب الكثير من الثغرات الأمنية الشائعة مثل حقن الشيفرة (Code Injection) والهجمات عبر المواقع (Cross-site scripting – XSS) وحقن قواعد البيانات (SQL Injection).
هذا المقال يُسلّط الضوء على جميع الجوانب التقنية الخاصة بالمرشحات ودوال المرشح في PHP، ويشرح بالتفصيل آلية عملها، أنواعها، استخداماتها، بالإضافة إلى كيفية دمجها ضمن بيئات التطوير الحديثة، مع تقديم أمثلة واقعية لتطبيقاتها.
تعريف المرشحات في PHP
المرشح في PHP هو وظيفة تقوم بتصفية أو التحقق من صحة قيمة معينة. تستخدم هذه الوظائف بشكل شائع لمعالجة المدخلات (خصوصًا من النماذج Forms أو من المتغيرات العالمية مثل $_POST, $_GET, $_COOKIE, $_REQUEST) قبل استخدامها في عمليات أخرى. الهدف الأساسي من استخدام المرشحات هو حماية التطبيق من البيانات غير المتوقعة أو الضارة.
تم تضمين هذه الدوال ضمن امتداد filter الذي بدأ دعمه منذ الإصدار PHP 5.2.
أهمية المرشحات في تأمين التطبيقات
عند التعامل مع بيانات مدخلة من المستخدم، من الضروري جدًا ألا تُستخدم هذه البيانات مباشرة داخل البرنامج بدون التحقق منها. لأن المستخدم قد يُدخل بيانات خبيثة تهدف إلى اختراق النظام أو تغيير سلوكه، مثل شيفرات JavaScript خبيثة، أو استعلامات SQL. الفشل في تعقيم هذه البيانات قد يؤدي إلى:
-
تنفيذ شيفرة خبيثة داخل المتصفح (XSS)
-
تنفيذ أوامر داخل السيرفر (Command Injection)
-
اختراق قواعد البيانات (SQL Injection)
-
عرض بيانات حساسة عن النظام
لهذا، تأتي المرشحات كوسيلة مضمنة داخل PHP لتنفيذ التحقق والمعالجة والتعقيم بشكل منهجي وآمن.
دوال المرشحات الأساسية في PHP
1. filter_var()
الدالة filter_var() هي الأكثر استخدامًا. تستخدم لتصفية قيمة واحدة.
php$value = "123abc";
$filtered = filter_var($value, FILTER_SANITIZE_NUMBER_INT);
echo $filtered; // الناتج: 123
البنية العامة:
phpfilter_var(mixed $value, int $filter = FILTER_DEFAULT, array|int $options = 0): mixed
2. filter_input()
تُستخدم لتصفية متغير مدخل من مصدر معين (INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, INPUT_ENV).
php$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
3. filter_input_array()
تُستخدم لتصفية مجموعة من المتغيرات دفعة واحدة.
php$args = array(
'email' => FILTER_VALIDATE_EMAIL,
'age' => array(
'filter' => FILTER_VALIDATE_INT,
'options' => array(
'min_range' => 18,
'max_range' => 100
)
)
);
$result = filter_input_array(INPUT_POST, $args);
4. filter_var_array()
تشبه filter_input_array() لكن تعمل على مصفوفة بيانات محلية بدلًا من المتغيرات العالمية.
php$data = array(
'email' => '[email protected]',
'age' => 25
);
$filters = array(
'email' => FILTER_VALIDATE_EMAIL,
'age' => array(
'filter' => FILTER_VALIDATE_INT,
'options' => array(
'min_range' => 18,
'max_range' => 99
)
)
);
$sanitized = filter_var_array($data, $filters);
أنواع المرشحات في PHP
تنقسم المرشحات في PHP إلى قسمين أساسيين:
أولًا: مرشحات التحقق (Validation Filters)
تتحقق من صحة البيانات دون تعديلها. تُعيد القيمة الأصلية إذا كانت صالحة، وfalse إذا لم تكن كذلك.
| الفلتر | الاستخدام |
|---|---|
FILTER_VALIDATE_BOOLEAN |
التحقق من قيمة منطقية |
FILTER_VALIDATE_EMAIL |
التحقق من صحة البريد الإلكتروني |
FILTER_VALIDATE_FLOAT |
التحقق من أن القيمة عدد عشري |
FILTER_VALIDATE_INT |
التحقق من أن القيمة عدد صحيح |
FILTER_VALIDATE_IP |
التحقق من عنوان IP |
FILTER_VALIDATE_MAC |
التحقق من عنوان MAC |
FILTER_VALIDATE_URL |
التحقق من رابط URL |
ثانيًا: مرشحات التعقيم (Sanitizing Filters)
تقوم بإزالة أو تعديل الأحرف غير المرغوب بها.
| الفلتر | الاستخدام |
|---|---|
FILTER_SANITIZE_EMAIL |
إزالة الأحرف غير الصالحة من البريد الإلكتروني |
FILTER_SANITIZE_ENCODED |
ترميز السلاسل لأغراض URL |
FILTER_SANITIZE_FULL_SPECIAL_CHARS |
تحويل الأحرف الخاصة إلى كيانات HTML |
FILTER_SANITIZE_NUMBER_FLOAT |
إزالة جميع الأحرف ما عدا الأرقام والفواصل العشرية |
FILTER_SANITIZE_NUMBER_INT |
إزالة جميع الأحرف ما عدا الأرقام وعلامة الطرح |
FILTER_SANITIZE_SPECIAL_CHARS |
تحويل الأحرف الخاصة إلى كيانات HTML |
FILTER_SANITIZE_STRING |
إزالة العلامات البرمجية HTML وPHP |
FILTER_SANITIZE_URL |
إزالة الأحرف غير الصالحة من عناوين URL |
مقارنة بين التحقق والتعقيم
| الجانب | التحقق (Validation) | التعقيم (Sanitization) |
|---|---|---|
| الهدف | التأكد من مطابقة البيانات لنمط معين | تنظيف البيانات من الرموز غير المرغوبة |
| النتيجة عند الفشل | FALSE | قيمة مُعدّلة |
| المثال | FILTER_VALIDATE_EMAIL |
FILTER_SANITIZE_EMAIL |
استخدام خيارات متقدمة مع المرشحات
يمكن تمرير خيارات إضافية عبر مصفوفة options للتحكم الدقيق في عملية التصفية.
مثال: التحقق من عدد صحيح في مدى محدد
php$age = "30";
$options = array(
"options" => array(
"min_range" => 18,
"max_range" => 99
)
);
$validAge = filter_var($age, FILTER_VALIDATE_INT, $options);
تعقيم مدخلات النماذج
يُعتبر هذا من أهم تطبيقات المرشحات. المثال التالي يُظهر كيف يمكن تعقيم جميع المدخلات من نموذج:
php$filters = array(
"name" => FILTER_SANITIZE_STRING,
"email" => FILTER_SANITIZE_EMAIL,
"age" => array(
"filter" => FILTER_VALIDATE_INT,
"options" => array("min_range" => 18)
)
);
$cleanData = filter_input_array(INPUT_POST, $filters);
تكامل المرشحات مع طبقات الأمان في التطبيق
1. الاستخدام داخل الطبقة الوسيطة (Middleware)
في إطار عمل مثل Laravel أو Symfony، يمكن استخدام المرشحات ضمن Middleware لمعالجة جميع الطلبات الواردة قبل وصولها إلى الـ Controller.
2. التكامل مع نماذج HTML
عند استقبال البيانات من النماذج، يجب تعقيمها قبل تخزينها أو عرضها:
php$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
3. التحقق قبل الإدخال إلى قاعدة البيانات
قبل تنفيذ أي استعلام SQL باستخدام بيانات من المستخدم:
php$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
if ($email !== false) {
// إدخال آمن
}
جدول يلخص أشهر المرشحات في PHP
| نوع الفلتر | اسم الفلتر | الاستخدام الرئيسي |
|---|---|---|
| التحقق | FILTER_VALIDATE_EMAIL |
التحقق من صحة البريد الإلكتروني |
| التحقق | FILTER_VALIDATE_INT |
التحقق من أن القيمة عدد صحيح |
| التحقق | FILTER_VALIDATE_URL |
التحقق من صحة الرابط |
| التعقيم | FILTER_SANITIZE_STRING |
إزالة العلامات HTML وPHP |
| التعقيم | FILTER_SANITIZE_EMAIL |
إزالة الأحرف غير الصالحة في البريد |
| التعقيم | FILTER_SANITIZE_URL |
إزالة الرموز غير الصالحة في URL |
| التعقيم | FILTER_SANITIZE_NUMBER_INT |
إزالة كل شيء ما عدا الأرقام |
| التعقيم | FILTER_SANITIZE_FULL_SPECIAL_CHARS |
تحويل الأحرف الخاصة لكيانات HTML |
الأداء والأمان
بما أن امتداد filter جزء مدمج من نواة PHP، فإن أداء هذه الدوال سريع جدًا مقارنة بحلول مخصصة يكتبها المطورون يدويًا. كما أن استخدامها يقلل من فرص ارتكاب أخطاء بشرية أثناء تنفيذ التحقق والتعقيم يدويًا.
أفضل الممارسات عند استخدام المرشحات
-
التحقق أولاً، التعقيم لاحقًا: لا تكتفِ بالتعقيم، بل تحقق من صحة البيانات.
-
حدد دائمًا نوع الفلتر بدقة: لتجنب تطبيق مرشحات غير مناسبة.
-
استخدم الخيارات (
options) لتحديد الحدود: مثل حدود الأرقام أو الأنماط. -
دمج التصفية مع الحماية من SQL Injection وXSS: التصفية لا تُغني عن استخدام أدوات مثل PDO وprepared statements.
-
تعقيم كل البيانات التي تُعرض للمستخدم: حتى وإن كانت موثوقة، تجنبًا للهجمات غير المتوقعة.
خاتمة
تشكل دوال المرشح (Filter Functions) في PHP جزءًا أساسيًا من أدوات الحماية والموثوقية في تطوير تطبيقات الويب. من خلال استعمال filter_var() وfilter_input() وfilter_input_array() وغيرهم من الوظائف، يمكن للمطور السيطرة الكاملة على كيفية التعامل مع البيانات القادمة من المستخدمين، سواء عبر التحقق أو التعقيم، وبالتالي تعزيز أمان النظام ضد الثغرات المعروفة. إن فهم واستعمال هذه الأدوات بطريقة سليمة يُعد من الخطوات الجوهرية لتأمين التطبيقات وضمان جودة بياناتها.
المراجع:
-
OWASP Foundation – Data Validation

